# -*- coding: UTF-8 -*-
from django.models.auth import log
from django.core import template

class AdminLogNode(template.Node):
    def __init__(self, limit, varname, user):
        self.limit, self.varname, self.user = limit, varname, user

    def __repr__(self):
        return "<Nœud GetAdminLog>"

    def render(self, context):
        if self.user is not None and not self.user.isdigit():
            self.user = context[self.user].id
        context[self.varname] = log.get_list(user_id__exact=self.user, limit=self.limit, select_related=True)
        return ''

class DoGetAdminLog:
    """
    Affecte à une variable du modèle le journal d'administration correspondant aux critères spécifiés.
    Usage :
        {% get_admin_log [limite] as [nom_variable] for_user [var_du_contexte_contenant_utilisateur] %}
    Exemples :
        {% get_admin_log 10 as log_administration for_user 23 %}
        {% get_admin_log 10 as log_administration for_user utilisateur %}
        {% get_admin_log 10 as log_administration %}
    Notez que [var_du_contexte_contenant_utilisateur] peut être un entier codé en dur (qui représente
    alors l'identifiant de l'utilisateur désiré) ou le nom d'une variable du contexte qui contient
    l'utilisateur désiré.
    """
    def __init__(self, tag_name):
        self.tag_name = tag_name

    def __call__(self, parser, token):
        tokens = token.contents.split()
        if len(tokens) < 4:
            raise template.TemplateSyntaxError, "Les instructions '%s' nécessitent deux arguments" % self.tag_name
        if not tokens[1].isdigit():
            raise template.TemplateSyntaxError, "Le premier argument de '%s' doit être un entier" % self.tag_name
        if tokens[2] != 'as':
            raise template.TemplateSyntaxError, "Le deuxième argument de '%s' doit être 'as'" % self.tag_name
        if len(tokens) > 4:
            if tokens[4] != 'for_user':
                raise template.TemplateSyntaxError, "Le quatrième argument de '%s' doit être 'for_user'" % self.tag_name
        return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(len(tokens) > 5 and tokens[5] or None))

template.register_tag('get_admin_log', DoGetAdminLog('get_admin_log'))
